from shapely.geometry import Point, Polygon
import numpy as np

def order_polygon_ccw(coords, start_point):
    """
    将坐标列表重新排序为逆时针方向，并以指定起点开始
    参数:
    coords (list): 多边形坐标列表 [[x1,y1], [x2,y2], ...]
    start_point (Point): 起始点对象
    返回:
    list: 重新排序后的坐标列表
    """
    # 计算多边形方向（使用鞋带公式）
    def compute_polygon_direction(coords):
        x = np.array([c[0] for c in coords])
        y = np.array([c[1] for c in coords])
        return np.sum(x[:-1] * y[1:] - x[1:] * y[:-1]) + x[-1] * y[0] - x[0] * y[-1]

    # 创建原始多边形的副本（防止修改原始数据）
    ordered_coords = coords.copy()

    # 检查多边形方向（正值为逆时针，负值为顺时针）
    if compute_polygon_direction(ordered_coords) < 0:
        # 反转坐标顺序（顺时针 -> 逆时针）
        ordered_coords = ordered_coords[::-1]

    # 找到起始点的索引
    start_index = None
    tolerance = 1e-8  # 浮点数比较容差
    for i, coord in enumerate(ordered_coords):
        if (abs(coord[0] - start_point.x) < tolerance and
                abs(coord[1] - start_point.y) < tolerance):
            start_index = i
            break

    if start_index is None:
        raise ValueError("起始点不在多边形坐标中")

    # 重新排序使起始点成为第一个元素
    reordered_coords = ordered_coords[start_index:] + ordered_coords[:start_index]

    return reordered_coords